/*
 * One Click Upload - jQuery Plugin
 * Copyright (c) 2008 Michael Mitchell - http://www.michaelmitchell.co.nz
 */
(function ($) {
    $.fn.upload = function (options) {
        /** Merge the users options with our defaults */
        options = $.extend({
            name: 'file',
            enctype: 'multipart/form-data',
            action: '',
            autoSubmit: true,
            onSubmit: function () {
            },
            onComplete: function () {
            },
            onSelect: function () {
            },
            params: {}
        }, options);

        return new $.ocupload(this, options);
    },

        $.ocupload = function (element, options) {
            /** Fix scope problems */
            var self = this;

            /** A unique id so we can find our elements later */
            var id = new Date().getTime().toString().substr(8);

            /** Upload Iframe */
            var iframe = $(
                '<iframe ' +
                'id="iframe' + id + '" ' +
                'name="iframe' + id + '"' +
                '></iframe>'
            ).css({
                display: 'none'
            });

            /** Form */
            var form = $(
                '<form ' +
                'method="post" ' +
                'enctype="' + options.enctype + '" ' +
                'action="' + options.action + '" ' +
                'target="iframe' + id + '"' +
                '></form>'
            ).css({
                margin: 0,
                padding: 0
            });

            /** File Input */
            var input = $(
                '<input ' +
                'name="' + options.name + '" ' +
                'type="file" ' +
                '/>'
            ).css({
                position: 'relative',
                display: 'block',
                marginLeft: -175 + 'px',
                opacity: 0
            });

            /** Put everything together */
            element.wrap('<div></div>'); //container
            form.append(input);
            element.after(form);
            element.after(iframe);

            /** Find the container and make it nice and snug */
            var container = element.parent().css({
                position: 'relative',
                height: element.outerHeight() + 'px',
                width: element.outerWidth() + 'px',
                overflow: 'hidden',
                cursor: 'pointer',
                margin: 0,
                padding: 0
            });

            /** Put our file input in the right place */
            input.css('marginTop', -container.height() - 10 + 'px');

            /** Move the input with the mouse to make sure it get clicked! */
            container.mousemove(function (e) {
                input.css({
                    top: e.pageY - container.offset().top + 'px',
                    left: e.pageX - container.offset().left + 'px'
                });
            });

            /** Watch for file selection */
            input.change(function () {
                /** Do something when a file is selected. */
                self.onSelect();

                /** Submit the form automaticly after selecting the file */
                if (self.autoSubmit) {
                    self.submit();
                }
            });

            /** Methods */
            $.extend(this, {
                autoSubmit: true,
                onSubmit: options.onSubmit,
                onComplete: options.onComplete,
                onSelect: options.onSelect,

                /** get filename */
                filename: function () {
                    return input.attr('value');
                },

                /** get/set params */
                params: function (params) {
                    var params = params ? params : false;

                    if (params) {
                        options.params = $.extend(options.params, params);
                    } else {
                        return options.params;
                    }
                },

                /** get/set name */
                name: function (name) {
                    var name = name ? name : false;

                    if (name) {
                        input.attr('name', value);
                    } else {
                        return input.attr('name');
                    }
                },

                /** get/set action */
                action: function (action) {
                    var action = action ? action : false;

                    if (action) {
                        form.attr('action', action);
                    } else {
                        return form.attr('action');
                    }
                },

                /** get/set enctype */
                enctype: function (enctype) {
                    var enctype = enctype ? enctype : false;

                    if (enctype) {
                        form.attr('enctype', enctype);
                    } else {
                        return form.attr('enctype');
                    }
                },

                /** set options */
                set: function (obj, value) {
                    var value = value ? value : false;

                    function option(action, value) {
                        switch (action) {
                            default:
                                throw new Error('[jQuery.ocupload.set] \'' + action + '\' is an invalid option.');
                                break;
                            case 'name':
                                self.name(value);
                                break;
                            case 'action':
                                self.action(value);
                                break;
                            case 'enctype':
                                self.enctype(value);
                                break;
                            case 'params':
                                self.params(value);
                                break;
                            case 'autoSubmit':
                                self.autoSubmit = value;
                                break;
                            case 'onSubmit':
                                self.onSubmit = value;
                                break;
                            case 'onComplete':
                                self.onComplete = value;
                                break;
                            case 'onSelect':
                                self.onSelect = value;
                                break;
                        }
                    }

                    if (value) {
                        option(obj, value);
                    } else {
                        $.each(obj, function (key, value) {
                            option(key, value);
                        });
                    }
                },

                /** Submit the form */
                submit: function () {
                    /** Do something before we upload */
                    this.onSubmit();

                    /** add additional paramters before sending */
                    $.each(options.params, function (key, value) {
                        form.append($(
                            '<input ' +
                            'type="hidden" ' +
                            'name="' + key + '" ' +
                            'value="' + value + '" ' +
                            '/>'
                        ));
                    });

                    /** Submit the actual form */
                    form.submit();

                    /** Do something after we are finished uploading */
                    iframe.unbind().load(function () {
                        /** Get a response from the server in plain text */
                        var myFrame = document.getElementById(iframe.attr('name'));
                        var response = $(myFrame.contentWindow.document.body).text();

                        /** Do something on complete */
                        self.onComplete(response); //done :D
                    });
                }
            });
        }
})(jQuery);